package com.cw.DesignModel23.Behavioral.StrategyPattern.Strategy2;


import java.util.Random;
//【具体策略二】
public class ProbStrategy implements Strategy {
    private Random random;
    private int prevHandValue = 0;
    private int currentHandValue = 0;
    /**
     * 过去的胜率：history[上一局出的手势][这一局所出的手势]
     * 假设上一局出的手势是石头：
     * history[0][0]：两局分别出了石头、石头的获胜次数
     * history[0][1]：两局分别出了石头、剪刀的获胜次数
     * history[0][2]：两局分别出了石头、布的获胜次数
     * 若history[0][0]=3；history[0][1]=5；history[0][2]=7
     * 下一把出什么？使用轮盘赌的方式，出石头的概率是3/15；出剪刀的概率是5/15；出布的概率是7/15
     */
    private int[][] history = {
            { 1, 1, 1, },
            { 1, 1, 1, },
            { 1, 1, 1, },
    };
    public ProbStrategy(int seed) {
        random = new Random(seed);
    }

    /**
     * 学习历史胜率，根据轮盘赌的方式来出下一个手势
     * @return
     */
    public Hand nextHand() {
        int bet = random.nextInt(getSum(currentHandValue));
        int handvalue = 0;
        if (bet < history[currentHandValue][0]) {
            handvalue = 0;
        } else if (bet < history[currentHandValue][0] + history[currentHandValue][1]) {
            handvalue = 1;
        } else {
            handvalue = 2;
        }
        prevHandValue = currentHandValue;
        currentHandValue = handvalue;
        return Hand.getHand(handvalue);
    }

    /**
     * 获取第一把出hv，第二把出1、2、3的总次数
     * @param hv
     * @return
     */
    private int getSum(int hv) {
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            sum += history[hv][i];
        }
        return sum;
    }

    /**
     * 学习经验，更新 history 表格
     * @param win
     */
    public void study(boolean win) {

        if (win) {
            history[prevHandValue][currentHandValue]++;
        } else {
            history[prevHandValue][(currentHandValue + 1) % 3]++;
            history[prevHandValue][(currentHandValue + 2) % 3]++;
        }
    }
}

